package com.wzh.store.controller;
import com.wzh.store.controller.ex.FileEmptyException;
import com.wzh.store.controller.ex.FileSizeException;
import com.wzh.store.controller.ex.FileTypeException;
import com.wzh.store.controller.ex.FileUploadIoExceptkion;
import com.wzh.store.entity.User;
import com.wzh.store.service.IUserService;
import com.wzh.store.service.ex.InsertException;
import com.wzh.store.service.ex.UsernameDuplicatedException;
import com.wzh.store.utils.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * @Author wzh
 * @create 2022/4/10 19:49
 */
@RestController
@RequestMapping("users")
public class UserController extends BaseController {
    @Autowired
    private IUserService iUserService;
    @RequestMapping("reg")
    public JsonResult<Void> reg(User user) {
        iUserService.reg(user);
        return new JsonResult<>(ok, message);
    }
    @RequestMapping("login")
    public JsonResult<User> login(String username, String password, HttpSession session){
      User data= iUserService.login(username, password);
//      向session对象中完成数据的绑定
      session.setAttribute("uid",data.getUid());
      session.setAttribute("username",data.getUsername());
//
      System.out.println(getUidFromSession(session));
      System.out.println(getUsernameFromSession(session));
      return new JsonResult<User>(ok,data);
    }

    /**
     *
     * @param oldPassword 需要和表单中的name属性一致
     * @param newPassword 需要和表单中的name属性一致
     * @param session springboot会自动给传入
     * @return JsonResult对象
     */
    @RequestMapping("change_password")
    public JsonResult<Void> changePassword(String oldPassword,String newPassword,HttpSession session){
        Integer uidFromSession = getUidFromSession(session);
        String usernameFromSession = getUsernameFromSession(session);
        iUserService.changePassword(uidFromSession,usernameFromSession,oldPassword,newPassword);
        return new JsonResult<>(ok,"密码修改成功");
    }

    @RequestMapping("get_by_uid")
    public JsonResult<User> getByUid(HttpSession session){
        User data = iUserService.getUserByUid(getUidFromSession(session));
        return new JsonResult<>(ok,data);
    }

    @RequestMapping("change_info")
    public JsonResult<Void> changeInfo(User user,HttpSession session){
        String username = getUsernameFromSession(session);
        Integer uid = getUidFromSession(session);
        iUserService.chabgeInfo(uid,username,user);
        return new JsonResult<>(ok);
    }
//定义一个常量设置文件上传的最大值,常量一般都要全部大写
    public static final Integer AVATAR_MAX_SIZE=10*1024*1024;
//    限制上传文件的类型
    public static final List<String> AVATAR_TYPE=new ArrayList<>();
    static {
        AVATAR_TYPE.add("image/jpeg");
        AVATAR_TYPE.add("image/jpg");
        AVATAR_TYPE.add("image/gif");
        AVATAR_TYPE.add("image/bmp");
        AVATAR_TYPE.add("image/png");
    }

    /**
     *
     * @param session
     * @param file MultipartFile由springmvc提供的接口，保证后端请求的参数与前端的name属性值一致，
     *             以便于前端参数的注入,前端会自动的将数据包传递给multipartFile对象
     *             这个接口为我们包装了获取文件类型的数据，任何类型的文件都可
     * @RequestParam  表示请求中的参数，将请求中的参数注入到请求处理方法的某个参数上，一般在名称不一致时使用
     * @return
     */
    @RequestMapping("change_avatar")
    public JsonResult<String> changeAvatar(HttpSession session, @RequestParam("file") MultipartFile file){
        if(file.isEmpty()){
            throw new FileEmptyException("上传文件为空，请重新上传");
        }
        if(file.getSize()>AVATAR_MAX_SIZE){
            throw new FileSizeException("上传文件大小不符合要求,文件大小超出限制");
        }
//      判断文件的类型是不是我们所规定的类型
        String contentType = file.getContentType();
        if(!AVATAR_TYPE.contains(contentType)){
            throw new FileTypeException("文件的类型不符合要求");
        }

        String parent = session.getServletContext().getRealPath("upload");
        File dir=new File(parent);
        if (!dir.exists()){  //检测当前目录是否存在
            dir.mkdirs();    //创建当前目录
        }

        Integer uid = getUidFromSession(session);
        String username = getUsernameFromSession(session);
//        获取文件名称，uuid工具来将一个新的字符串来做为文件名，以防止文件名重复导致覆盖问题
//        例如avatar01.png
        String originalFilename = file.getOriginalFilename();
        System.out.println("OriginalFilename="+originalFilename);
//        保存其后缀名
        int i = originalFilename.lastIndexOf(".");
        String suffix = originalFilename.substring(i);
        String fileName = UUID.randomUUID().toString().toUpperCase()+suffix;
//        在dir下创建一个名为fileName的文件,是一个空文件，将参数file中的数据写入到该文件中
        File dest=new File(dir,fileName);
        try {
            file.transferTo(dest);
        } catch (IOException e) {
           throw new FileUploadIoExceptkion("文件读写异常");
        }

        String avatar="/upload/"+fileName;
        iUserService.changeAvatar(uid,avatar,username);
//        返回用户头像路径给前端页面，将来用于用户头像的展示
      return new JsonResult<>(ok,avatar);
   }

}

